package com.charlotte.study.gupao.flyweight.jdk;

/**
 * @author junjie.ding
 * @date 2020/3/10
 */
public class string {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "hello";
        String s3 = "he" + "llo";
        String s4 = "hel" + new String("lo");
        String s5 = new String("hello");
        String s6 = s5.intern();
        String s7 = "h";
        String s8 = "ello";
        String s9 = s7 + s8;
        System.out.println(s1==s2);//true，s1先于s1创建，已经放入常量池中，
        System.out.println(s1==s3);//true，s3在编译阶段，由jvm已经组装成hello，所以与s1一样
        System.out.println(s1==s4);//false， new String("lo") 语句创建了两个对象，lo 和new String("lo")，前者放在常量池中，后者放在堆中，相加的操作在堆中，所以s4对象在堆中，而s1在常量池中，故不相等
        System.out.println(s1==s9);//false，s7和s8不会在编译阶段优化，所以s9在堆中
        System.out.println(s4==s5);//false，s4 和 s5都在堆中
        System.out.println(s1==s6);//true，s5.intern()方法使得位于堆中的字符串在运行期间动态的加入到常量池中，所以这时候s6已经指向常量池中的"hello"，所以s1=s6
    }
}
